package hector.tang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

@Controller
@RequestMapping("anno")
@SessionAttributes(value = {"msg"})
public class AnnoController {

    /**
     * @RequestParam
     *
     * 如果请求的参数和方法的参数名称不同，可以使用@RequestParam注解
     *
     * <a href="anno/doParam?uname=tom">requestParam</a>
     *
     * public String requestParam(@RequestParam("uname") String userNmae)
     *      属性 value/name 指定请求参数的名称
     *      required =true 表示请求的url中必须要有该参数
     *          @RequestParam(value = "uname",required = true) 请求中必须要携带 参数uname
     *
     */

    @RequestMapping("/doParam")
    public String requestParam(@RequestParam(value = "uname",required = true) String userNmae){
        System.out.println("doparam   userName:"+userNmae);
        return "success";
    }

    /**
     * @RequestBody注解只适用于post请求，因为get请求没有请求体，所有的数据都在url中
     * 作用是将请求体以key=value&key=value的字符串形式封装到方法的参数中
     * 请求体:uname=tom&password=123456
     * @param body
     * @return
     */
    @RequestMapping("/body")
    public String requestBody(@RequestBody String body) throws UnsupportedEncodingException {
        body=URLDecoder.decode(body,"utf-8");
        System.out.println("请求体:"+body);
        return "success";
    }

    /**
     *  @PathVariable注解   restful风格请求获取占位符
     */

    @RequestMapping(path = "/{sid}",method = {RequestMethod.GET})
    public String restful(@PathVariable(name = "sid") String id){
        System.out.println("restful风格请求路径 id:"+id);
        return "success";
    }

    /**
     *   注解@RequestHeader(value = "Accept") String header 将指定的请求头的值复制给方法参数
     * @param header
     * @return
     */
    @RequestMapping("/header")
    public String header(@RequestHeader(value = "Accept") String header){
        System.out.println("header:"+header);
        return "success";
    }

    /**
     * 注解@CookieValue(value = "JSESSIONID") String value 获取指定名称的cookie的值
     * @param value
     * @return
     */
    @RequestMapping("/cookie")
    public String cookie(@CookieValue(value = "JSESSIONID") String value) {
        System.out.println("cookieValue:" + value);
        return "success";
    }

//    @RequestMapping("/testModelAttribute")
//    public String testModelAttribute(User user){
//        System.out.println("执行 testModelAttribute 方法");
//        return "success";
//    }

    /**
     * 加了@ModelAttribute的方法会在其他响应请求的方法执行之前先执行
     *  作用 例如：表单提交的数据不够完整，可以在此方法中获取数据库的值填入封装的javaBean中
     */
//    @ModelAttribute
//    public void modelAttribute(){
//        System.out.println("执行 ModelAttribute 方法==========");
//    }

    //----------------------------------------------------


//    @RequestMapping("/testModelAttribute")
//    public String testModelAttribute(User user){
//        //浏览器只传递username 但是经过 modelAttribute2方法的处理，将完整的user信息封装到user对象中
//
//        System.out.println("执行 testModelAttribute 方法");
//        System.out.println(user);
//        return "success";
//    }

    /**
     * 有返回值的情况可以直接返回封装对象
     * @param uname
     * @return
     */
//    @ModelAttribute
//    public User modelAttribute2(String uname){
//        System.out.println("执行 ModelAttribute2 方法==========");
//        User user=new User();
//        user.setUname("jerry");
//        user.setAge(30);
//        user.setBirthday(new Date());
//        return user;
//    }

    //--------------------------------------------------------------------------

    /**
     * @param
     * @return
     */
//    @RequestMapping("/testModelAttribute")
//    public String testModelAttribute(@ModelAttribute(name = "jerry") User user){
//        //浏览器只传递username 但是经过 modelAttribute2方法的处理，将完整的user信息封装到user对象中
//
//        System.out.println("执行 testModelAttribute 方法");
//        System.out.println(user);
//        return "success";
//    }


//    @ModelAttribute
//    public void modelAttribute2(String uname, Map<String,User> map){
//        System.out.println("执行 ModelAttribute2 方法==========");
//        User user=new User();
//        user.setUname("jerry");
//        user.setAge(30);
//        user.setBirthday(new Date());
//        map.put("jerry",user);
////        return user;
//    }


    /*
    测试 @SessionAttributes 注解 ，该注解只能放在类名上

    @SessionAttributes(value = {"msg"})
        标注了 当model对象执行 addAttribute 时 除了会向request域中添加(默认)，也会向session域中添加attribute

     */
    @RequestMapping("/sessionAttributes")
    public void testSessionAttributes(Model model) {
        System.out.println("执行了TestSessionAttributes");
        //model底层是将对象存入到request域中
        model.addAttribute("msg", "model.addAttribute");
    }

    @RequestMapping("/getSessionAttributes")
    public void getSessionAttributes(ModelMap modelMap) {
        System.out.println("执行了getSessionAttributes");
        //testSessionAttributes存入session域的msg可以通过ModelMap获取出来

        modelMap.get("msg");
    }

    @RequestMapping("/delSessionAttributes")
    public String delSessionAttributes(SessionStatus status) {

        status.setComplete();//清除session域中的对象
        return "success";
    }


}
